/**
 * Copyright © 2010 DocuLibre inc.
 * 
 * This file is part of Constellio.
 * 
 * Constellio is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Constellio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Constellio.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.doculibre.constellio.connector.persistence.config;

import java.io.File;
import java.util.Properties;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.doculibre.constellio.connector.persistence.config.PersistenceContextConfig;

/**
 * The persistence context for JPA-based services. Manages sesions using a
 * ThreadLocal object.
 * 
 * @author Nicolas Bélisle (nicolas.belisle@doculibre.com)
 */
public class PersistenceContext {

	private final EntityManagerFactory entityManagerFactory;

	private final ThreadLocal<EntityManager> entityManagers = new ThreadLocal<EntityManager>();

	private final PersistenceContextConfig config;

	public PersistenceContext(PersistenceContextConfig config) {
		if (config == null) {
			throw new NullPointerException("Null database config ");
		}
		Properties customProperties = new Properties();
		this.config = config;
		if (new File(this.config.getConnectionUrlPath()).exists()) {
			customProperties.put("hibernate.connection.url", "jdbc:derby:"
					+ this.config.getConnectionUrlPath());
		} else {
			customProperties.put("hibernate.connection.url", "jdbc:derby:"
					+ this.config.getConnectionUrlPath() + ";create=true");
		}
		entityManagerFactory = Persistence.createEntityManagerFactory(
				config.getEntityManagerFactoryName(), customProperties);
	}

	public void close() {
		if (entityManagerFactory.isOpen()) {
			entityManagerFactory.close();
		}
	}

	public EntityManager getCurrentEntityManager() {
		EntityManager em = entityManagers.get();
		if (em == null || !em.isOpen()) {
			em = entityManagerFactory.createEntityManager();
			entityManagers.set(em);
		}
		return em;
	}
}
